//取消Promise的核心思想就是抛出异常

//1.Peromise是否兑现

//兑现了：啥也不干

//没有兑现：抛出异常，营造一个家乡网，取消了promise

//2.通过额外声明一个类，类里面改写传入的resolve函数

class CancelPromise{
    /**
     * 
     * @param {Function} excutor 自己仿照Promise传入的函数(reslove,reject)=>{}
     * @param {Object} singal AbortConstroller中的singal对象，使用他可以监听abort调用的时候，添加对应的逻辑
     */
    constructor(excutor,singal=null){
        console.log(excutor);

        //用于存储一个改写的reslove
        let _resolve = null
        //声明一个reject变量，存储promise的reject方法


        //用于判断promise的状态是否兑现
        let isFulfilled = false

        let promise = new Promise((resolve,reject)=>{
            _resolve = (value) =>{
                isFulfilled=true;//状态已经兑现了
                resolve(value)
            }

            excutor(_resolve,reject)
        })
        //判断是否传递了signal
        if(singal){
            //侦听 AbortConstroller是否调用了abort()这个方法
            singal.addEventListener('abort',()=>{
                //如果isFilled是true 表示promise已经兑现了，没有必要中断了
                if(isFulfilled){
                    return
                }
                //侦听到了，说明要取消promise
                throw Error('状态已经取消')
            })
        }
        return promise
    }
}
let fn = (resolve,reject)=>{
    setTimeout(()=>{
        resolve({state:true,data:['吃吃','喝喝']})
    },5000)
}
//控制取消的对象
let abortConstroller = new AbortController()

let singal = abortConstroller.singal
//取消的方法

setTimeout(()=>{
    abortConstroller.abort()
},1000)

let p = new CancelPromise(fn,singal)
.then(res=>{
    console.log('then逻辑执行了');
    console.log(res);
})